﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Data.SQLite;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace MyVideoTek
{
    class Fichier : SqliteData
    {
        #region Attributs
        private int idFichier;
        private string path;
        private string numCd;
        private int idFilm;
        #endregion

        #region Constructeur
        public Fichier(string src= null, string cd = null, int identifiantFilm = 0) 
        {
            //Recup l'ID
            path = src;
            numCd = cd;
            idFilm = identifiantFilm;

            //Verification si le genre et le film sont déjà associés
            if (!VerifDoublon(path) && path != null)
            {
                //Ajoute le nouveau genre
                InsertFichier();
            }
            else if (idFilm != 0)
            {
                GetFichierbyIdFilm();
            }
        }
        #endregion

        #region Insertion Fichier BDD
        public void InsertFichier()
        {
            //Miniscule
            idFichier = maxId();

            //Si le genre n'existe pas
            if (!VerifDoublon(path))
            {
                //Requete insertion Film
                string maRequete = "INSERT INTO fichier(id_fichier, src_fichier, num_cd_fichier, id_film) VALUES(" +
                                         "@idFichier, @path, @numCd, @idFilm)";

                //Création de la commande SQL 
                SQLiteConnection maConnexionSQLsrv = new SQLiteConnection(NameBdd);
                SQLiteCommand myCommand = new SQLiteCommand(maRequete, maConnexionSQLsrv);

                //Paramètrage da requete
                myCommand.Parameters.Add(new SQLiteParameter("@idFichier"));
                myCommand.Parameters.Add(new SQLiteParameter("@path"));
                myCommand.Parameters.Add(new SQLiteParameter("@numCd"));
                myCommand.Parameters.Add(new SQLiteParameter("@idFilm"));
                myCommand.Parameters["@idFichier"].Value = Convert.ToInt32(idFichier);
                myCommand.Parameters["@path"].Value = path;
                myCommand.Parameters["@numCd"].Value = Convert.ToInt32(numCd);
                myCommand.Parameters["@idFilm"].Value = Convert.ToInt32(idFilm);

                //Tente d'inserer un film
                try
                {
                    //Execution de la requête 
                    myCommand.Connection.Open();
                    myCommand.ExecuteNonQuery();
                    myCommand.Connection.Dispose();
                }
                catch (SqlException ex)
                {
                    //Message d'erreur
                    MessageBox.Show(ex.Message);
                }
            }
        }
#endregion

        #region Verification Doublon
        private bool VerifDoublon(string unPath)
        {
            bool result = false;

            //Requete
            string maRequete = "SELECT * FROM fichier WHERE src_fichier = @unPath";

            //Création de la commande SQL 
            SQLiteConnection maConnexionSQLsrv = new SQLiteConnection(NameBdd);
            SQLiteCommand myCommand = new SQLiteCommand(maRequete, maConnexionSQLsrv);

            //paramètre de la requete
            myCommand.Parameters.Add(new SQLiteParameter("@unPath"));
            myCommand.Parameters["@unPath"].Value = unPath;

            SQLiteDataReader resultReader = null;

            //Tente d'inserer un film
            try
            {
                //Execution de la requête 
                myCommand.Connection.Open();
                resultReader = myCommand.ExecuteReader();

            }
            catch (SqlException ex)
            {
                //Message d'erreur
                MessageBox.Show(ex.Message);
            }

            //True s'il y a doublon
            result = resultReader.HasRows;

            //Ferme la connexion
            myCommand.Connection.Dispose();
            return result;
        }
        #endregion

        #region Recupère l'id +1
        private int maxId()
        {
            //Connection à la base de donnée
            int retour = 1;
            SqliteData db = new SqliteData();
            DataTable resultTable = db.Select("SELECT max(id_fichier)+1 FROM fichier");

            //Recupère la ligne de resultat
            DataRow row = resultTable.Rows[0];

            //S'il y a rien, c'est qu'il y a aucun enregistrement docn on commence l'incrémente à 1
            if (row[0].ToString() != "")
            {
                retour =  Convert.ToInt32(row[0].ToString());
            }

            return retour;
        }
        #endregion

        #region Récupère un Fichier par un Id de film
        public string GetFichierbyIdFilm()
        {
            //Requete
            string maRequete = "SELECT * FROM fichier WHERE id_film = @idFilm";

            //Création de la commande SQL 
            SQLiteConnection maConnexionSQLsrv = new SQLiteConnection(NameBdd);
            SQLiteCommand myCommand = new SQLiteCommand(maRequete, maConnexionSQLsrv);

            //Paramètre de la requete
            myCommand.Parameters.Add(new SQLiteParameter("@idFilm"));
            myCommand.Parameters["@idFilm"].Value = idFilm;

            SQLiteDataReader resultReader = null;

            //Tente d'executer la requete
            try
            {
                //Execution de la requête 
                myCommand.Connection.Open();
                resultReader = myCommand.ExecuteReader();
            }
            catch (SqlException ex)
            {
                //Message d'erreur
                MessageBox.Show(ex.Message);
            }

            //Parcours et Assignation
            while (resultReader.Read())
            {
                idFichier = Convert.ToInt32(resultReader["id_fichier"].ToString());
                path = resultReader["src_fichier"].ToString();
                numCd =  resultReader["num_cd_fichier"].ToString();
                idFilm = Convert.ToInt32(resultReader["id_film"].ToString());
            }

            //Libère la mémoire
            myCommand.Connection.Dispose();

            return path;
        }
        #endregion

        #region Accesseur
        public int IdFichier
            {
                get { return idFichier; }
            }
            public string Path
            {
                get { return path; }
            }
            public string NumCd
            {
                get { return numCd; }
            }
            public int IdFilm
            {
                get { return idFilm; }
            }
        #endregion
    }
}
